package com.antgroup.seckill.business.utils;

import com.antgroup.seckill.business.common.commonmodel.SequenceResult;
import com.antgroup.seckill.business.common.enums.DBTypeEnum;
import com.antgroup.seckill.business.common.enums.SequenceNameEnum;
import org.apache.commons.lang3.StringUtils;

import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Random;

/**
 * 数据库主键ID生成
 *
 * @author wangxy
 * @date 2024/8/23 23:01
 */
public class SequenceUtil {


    /**
     * 生成序列号
     *
     * @param sequenceCode 表code
     * @param dbRuleName   DB规则
     * @param parameters   参数
     * @return
     */
    public static SequenceResult getNextSequenceValue(String sequenceCode, String dbRuleName, List<String> parameters) {
        // 模拟生成一个新的序列值
        String generatedSequenceValue = generateSequence(sequenceCode, dbRuleName, parameters);

        // 创建一个新的 SequenceResult 对象
        SequenceResult result = new SequenceResult();
        result.setSequenceValue(generatedSequenceValue);
        result.setSequenceCreatedDate(new Date());
        //这里暂时写死
        result.setDatasource("123");
        result.setDbType(DBTypeEnum.MYSQL.getCode());
        return result;
    }

    /**
     * 生成序列值
     *
     * @param sequenceCode 序列名称的代码
     * @param dbRuleName   数据库规则名称
     * @param parameters   其他相关参数
     * @return 生成的序列值
     */
    private static String generateSequence(String sequenceCode, String dbRuleName, List<String> parameters) {
        // 在这里添加实际的序列生成逻辑，例如根据参数构造唯一的序列号
        return sequenceCode + "-" + System.currentTimeMillis();
    }

    /**
     * 生成ID
     *
     * @param dateStr
     * @param seqStr
     * @return
     */
    private static String doGenID(String dateStr, String seqStr) {
        StringBuilder id = new StringBuilder();
        //8位日期
        id.append(dateStr);
        //数据版本为，默认8.0
        id.append("80");
        //8位sequence
        id.append(seqStr);
        return id.toString();
    }

    public static void main(String[] args) {
        String id = getSequenceId(SequenceNameEnum.OS_ORDER.getCode());
        String sequenceIdV2 = getSequenceIdV2();
        System.out.println(id);
        System.out.println(sequenceIdV2);
    }

    public static String getSequenceId(String sequenceName) {
        SequenceResult simple = getNextSequenceValue(sequenceName, "SIMPLE", Arrays.asList(new String[]{"00"}));

        //获取下一个seq值
        String seqStr = simple.getSequenceValue();

        //如果大于length位，则截取低length位
        if (seqStr.length() > 8) {
            seqStr = StringUtils.substring(seqStr, -8);
        }
        //如果不足length，则使用0补足
        String s = alignRight(seqStr, 8, "0");
        //日期转换:8位yyyyMMdd格式
        DateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
        String today = dateFormat.format(new Date());
        return doGenID(today, s);

    }


    /**
     * @param input
     * @param length
     * @param padChar
     * @return
     */
    public static String alignRight(String input, int length, String padChar) {
        if (input == null) {
            input = "";
        }
        if (padChar == null || padChar.length() == 0) {
            throw new IllegalArgumentException("Pad character must not be null or empty");
        }
        if (input.length() >= length) {
            return input;
        }
        StringBuilder sb = new StringBuilder();
        while (sb.length() < length - input.length()) {
            sb.append(padChar);
        }
        sb.append(input);

        return sb.toString();

    }

    /**
     * 简化版生成数据库库表主键ID
     *
     * @return 数据库主键ID
     */
    public static String getSequenceIdV2() {

        // 获取当前日期并格式化为 yyyyMMdd
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
        String today = dateFormat.format(new Date());

        // 生成10位随机数
        Random random = new Random();
        StringBuilder randomDigits = new StringBuilder();
        for (int i = 0; i < 10; i++) {
            randomDigits.append(random.nextInt(10)); // 生成0到9的随机数
        }
        // 拼接日期和随机数
        return today + randomDigits;
    }

}
